package cn.joyfulmedia.mis.utils;

import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

/**
 * Created by loumingshan on 2018/3/11.
 */
public class CsvUtil {
    /**
     * 导出生成csv格式的文件
     *
     * @param titles    csv格式头文
     * @param propertys 需要导出的数据实体的属性，注意与title一一对应
     * @param list      需要导出的对象集合
     * @return
     * @throws IOException              Created     2017年1月5日 上午10:51:44
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @author ccg
     */
    public static <T> void exportCsv(ServletOutputStream ow, String[] titles, String[] propertys, List<T> list) throws IOException, IllegalArgumentException, IllegalAccessException {
        try {
            StringBuilder sb = new StringBuilder();
            //csv文件是逗号分隔，除第一个外，每次写入一个单元格数据后需要输入逗号
            for (String title : titles) {
                sb.append(title);
                sb.append(",");
            }
            //写完文件头后换行
            sb.append("\r\n");
            //写内容
            for (Object obj : list) {
                //利用反射获取所有字段
                Field[] fields = obj.getClass().getDeclaredFields();
                for (String property : propertys) {
                    for (Field field : fields) {
                        //设置字段可见性
                        field.setAccessible(true);
                        if (property.equals(field.getName())) {
                            if (field.get(obj) != null) {
                                sb.append(field.get(obj).toString());
                                sb.append(",");
                            } else {
                                sb.append(",");
                            }
                            continue;
                        }
                    }
                }
                //写完一行换行
                sb.append("\r\n");
            }
            //写入输出流
            ow.write(sb.toString().getBytes("GBK"));
            //缓存流
            ow.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ow != null) {
                try {
                    ow.close();//一定要将流关闭，否则日志中会出错
                    ow = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException, IllegalArgumentException, IllegalAccessException {

    }
}
